package com.shujia.scala

import java.io.{BufferedReader, FileReader}
import java.util

import scala.io.Source

object Demo23WordCount {
  def main(args: Array[String]): Unit = {

    /**
      *
      * 使用java的方式统计单词的数量
      *
      */

    val hashMap = new util.HashMap[String, Integer]()

    val bufferedReader = new BufferedReader(new FileReader("data/words.txt"))

    var line: String = bufferedReader.readLine()
    while (line != null) {
      val split: Array[String] = line.split(",")
      for (word <- split) {

        //判断map集合中是否存在这个单词
        if (hashMap.containsKey(word)) {
          //取出之前的统计结果
          val count: Integer = hashMap.get(word)
          //在之前的基础上加一
          hashMap.put(word, count + 1)
        } else {
          //如果单词在hashMap中不存在存一个一进去
          hashMap.put(word, 1)
        }
      }
      line = bufferedReader.readLine()
    }

    println(hashMap)


    println("=" * 100)

    /**
      * 是同scala 统计
      *
      */

    //1、读取文件
    val lines: List[String] = Source.fromFile("data/words.txt").getLines().toList

    //2、将每一行中的多个单词拆分出来，每隔单词一行
    val words: List[String] = lines.flatMap(line => line.split(","))

    /**
      *
      * groupBy: 指定一个字段进行分组
      *
      * 返回一个map集合
      * map集合的key 是分组的字段
      * map集合的values是组内所有的元素
      *
      */
    //3、按照单词分组，将同一个单词分到同一个组内
    val groupBy: Map[String, List[String]] = words.groupBy((word: String) => word)


    //4、统计啊的农村的数量
    val wordCount: Map[String, Int] = groupBy.map(kv => {
      //eky
      val word: String = kv._1

      //组内所有的单词
      val values: List[String] = kv._2

      //计算单词的数量
      val count: Int = values.length

      //返回结果
      (word, count)
    })

    wordCount.foreach(println)


    println("=" * 100)

    /**
      * 链式调用
      *
      */

    Source.fromFile("data/words.txt")
      .getLines()
      .toList
      .flatMap(_.split(",")) //将一行转换成多行
      .groupBy(w => w) //按照单词分组
      .map(kv => (kv._1, kv._2.length)) //统计单词的数量
      .foreach(println)


  }

}
